"""
selenium 元素定位方式:
    id
    name
    class
    tag_name
    link text
    partial link text
    xpath
    css_selector
其中:
    css_selector 最推荐
        当有id时 , 也建议适用 css_selector 进行元素定位 , ( #id )
    其次是 xpath
        xpath 定位比较通用 , 别的定位方式定位不到的时候 , xpath 往往能够定位到 .
        css_selector 不好逆推定位 , 而 xpath 可以逆推定位 .



xpath定位规则:

    路径:
        /     绝对路径
        //    相对路径
        .     当前路径
        ..    父级路径
        @attribute = value  # 根据属性定位

    [] 条件:
        //input[1]
        (//input)[1]  # 注意 , 索引的优先级 , 高于路径的优先级
        //input[@name]  # 包含 name 属性的 input
        //input[@name='wd']  # name 属性值为 wd 的 input
        //span/input[@name='wd']  # 父级为 span , name 属性为 wd 的 input
        //input[../span/@class='soutu-btn']  # 找 input , 其父级为 span , class 属性为 soutu-btn
        //input[@name='wd' and @id='kw']  # 找 input , 其 name 属性为 wd 且 id 属性为 kw
        //input[@name='wd' or @id='kw']  # 找 input , 其 name 属性为 wd 或 id 属性为 kw

    函数:
        //a[text()='视频']
            //a[contains(text(),'视频')]
        //span[starts-with(@class,'bg')

    轴定位:
        self                  表示自己
        attribute             所有属性
        parent                父亲
        ancestor              所有父辈
        ancestor_or_self      所有父辈以及本身
        child                 所有儿子
        descendant            所有后代
        descendant-or-self    所有后代以及本身
        follwing              之后的所有标签
        following-sibling     同层下的弟弟中
        preceding             之前的所有节点
        preceding-sibiling    之前的所有同级节点

    轴定位演示: ( 示例基本都是百度首页的 )
        //input[@id='kw']//self::input
        //input[@id='kw']//attribute::*
        //input[@id='kw']//parent::span
        //input[@id='kw']//ancestor::span
        //input[@id='kw']//ancestor-or-self::input
        //span[contains(@class,'bg')]//child::input
        //span[contains(@class,'bg')]//descendant::a
        //span[contains(@class,'bg')]//descendant-or-self::a
        //input[@name='rn']//following::input
        //input[@name='rn']//following-sibling::input
        //input[@name='rn']//preceding::input
        //input[@name='rn']//following-sibling::input



xpath 页面调试:
    Elements 中 , Ctrl + F , 然后输入 Xpath 表达式调试 .
    Console 中 , $x() , 中输入 Xpath 表达式调试 .

"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from basic.s1_pytest_base import TestBase


class TestXpath(TestBase):

    # 使用 xpath 点击进入懂车帝排行榜界面等操作 .
    # 懂车帝首页 , 排行榜界面 , #sideItemWrap_rank 并不唯一 , 不过我们要点击的 , 是第一个 , 因此直接定位即可 .
    def test_oo1(self):
        self.driver.get('https://www.dongchedi.com/')
        self.driver.maximize_window()

        # 定位 排行榜
        phb_xpath = '//li[@id="sideItemWrap_rank"]'
        ele_phb = self.driver.find_element(By.XPATH, phb_xpath)
        ele_phb.click()

        # 定位 新能源
        xny_xpath = '//div[@class="tw-relative levels_button__oiTOw tw-mr-8"]//a[contains(text(),"新能源")]'
        ele_xny = self.driver.find_element(By.XPATH, xny_xpath)
        ele_xny.click()

        # 定位 新能源按钮
        xny_zi_xpath = '(//button/i[@class="DCD_Icon icon_triangle_down_12"])[last()]'
        ele_xny_zi = self.driver.find_element(By.XPATH, xny_zi_xpath)
        ele_xny_zi.click()

        # 定位 增程式
        zcs_xpath = '//a[contains(text(),"增程式")]'
        ele_zcs = self.driver.find_element(By.XPATH, zcs_xpath)
        ele_zcs.click()

        # 定位 排行榜第一
        url_zcs = 'https://www.dongchedi.com/sales/sale-energy_3-x-x-x-x-x'
        self.wait.until(expected_conditions.url_to_be(url_zcs))
        # 这里有一个问题 , 就是上一个点击增程式可能还没生效 , 这里的排行榜第一已经被点击了 .
        # 上边的元素等待解决了该问题 , 等待 url 变更之后 , 再进行点击 .
        no1_xpath = '//img[@class="zoom"]'
        ele_no1 = self.driver.find_element(By.XPATH, no1_xpath)
        ele_no1.click()
